package com.assumejson.transaction;

import com.assumejson.transaction.config.AppConfig;
import com.assumejson.transaction.service.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @author gang.Li
 * @version 1.0
 * @since 1.0 2021/12/13 10:37
 */
public class MainStart {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

		UserService userService = context.getBean("userService", UserService.class);
		userService.test();

	}
	/**
	 * Spring Transaction 的 大致步骤
	 * 1. 获取到Spring事务管理器，创建数据库连接
	 * 2. conn.autoCommit = false;
	 * 	2.1 创建的数据库连接是怎么传入到target方法中的呢？
	 * 		使用ThreadLocal<map> key : DataSource, value: conn(数据库连接) 将数据库连接传入到target方法中
	 * 3. target.test() sql （这里需要注意的就是使用AOP 的动态代理的数据库连接操作）--> 如果此时进行事务的隔离级别是在执行另外的方法时，新开一个事务，那么在执行a（）方法时，
	 * 		3.1 事务隔离级别：新开一个事务
	 * 				首先要将test中的conn挂起，挂起--->将ThreadLocal中的conn拿出来，并且清空ThreadLocal
	 *				再重新创建一个conn存到threadLocal中。ThreadLocal<map> key : DataSource, value: conn1(数据库连接)
	 *				执行 a（） sql
	 *				conn1.commit
	 *				恢复conn挂起的数据库连接，并且将ThreadLocal中的conn1删除，将挂起的conn存入到ThreadLocal中
	 * 4. 提交、回滚
	 */
}
